package com.zerui.manager.openplan.task;

import com.zerui.manager.openplan.gateway.OpenPlanGateWay;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.concurrent.DelayQueue;

/**
 * @Author wh
 * @create_time 2023-06-28 15:02
 */
@Component
@Slf4j
public class OpenPlanDelayTaskRunner implements InitializingBean {

    @Resource
    private DelayQueue<OpenPlanDelayTask> openPlanDelayQueue;
    @Resource
    private OpenPlanGateWay openPlanGateWay;

    @Override
    public void afterPropertiesSet() {
        new Thread(() -> {
            try {
                while(true) {
                    OpenPlanDelayTask task = openPlanDelayQueue.take();
                    Long planId = task.getPlanId();
                    execute(planId);
                }
            } catch (InterruptedException e) {
                // 因为是重写Runnable接口的run方法，子类抛出的异常要小于等于父类的异常。而在Runnable中run方法是没有抛异常的。所以此时是不能抛出InterruptedException异常。如果此时你只是记录日志的话，那么就是一个不负责任的做法，因为在捕获InterruptedException异常的时候自动的将是否请求中断标志置为了false。在捕获了InterruptedException异常之后，如果你什么也不想做，那么就将标志重新置为true，以便栈中更高层的代码能知道中断，并且对中断作出响应。
                Thread.currentThread().interrupt();
            }
        }).start();
    }

    private void execute(Long implementId) {
        openPlanGateWay.executeTask(implementId);
    }
}
